package day14;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * @author: 王丹
 * @create: 2021-07-06 15:50
 * LockSupport.park方法让线程等待之后，唤醒方式有2种：
 * 调用LockSupport.unpark方法
 * 调用等待线程的 interrupt()方法，给等待的线程发送中断信号，可以唤醒线程
 **/
public class Demo9 {

    /**
     * 运行结果分析:
     * t1线程中调用了park()方法让线程等待，主线程休眠了5秒之后，调用 t1.interrupt();给线程t1发送中断信号，
     * 然后线程t1从等待中被唤醒了，输出结果中的1、4行结果相差5秒左右，刚好是主线程休眠了5秒之后将t1唤醒了。
     * 结论：park方法可以响应线程中断。
     *
     * LockSupport.park方法让线程等待之后，唤醒方式有2种：
     * 调用LockSupport.unpark方法
     * 调用等待线程的 interrupt()方法，给等待的线程发送中断信号，可以唤醒线程
     */
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println(System.currentTimeMillis() + "," + Thread.currentThread().getName() + " start!");
            System.out.println( Thread.currentThread().getName() + " park之前中断标志" + Thread.currentThread().isInterrupted());
            LockSupport.park();
            System.out.println( Thread.currentThread().getName() + " park之后中断标志" + Thread.currentThread().isInterrupted());
            System.out.println(System.currentTimeMillis() + "," + Thread.currentThread().getName() + " 被唤醒!");
        });
        t1.setName("t1");
        t1.start();
        TimeUnit.SECONDS.sleep(5);
        t1.interrupt();
    }
}
